type token =
  | NUM of (int)
  | ID of (string)
  | INT
  | VOID
  | IF
  | ELSE
  | WHILE
  | BREAK
  | CONTINUE
  | RETURN
  | SEMICOLON
  | COMMA
  | LPAREN
  | RPAREN
  | LBRACE
  | RBRACE
  | ADD
  | SUB
  | MUL
  | DIV
  | MOD
  | ASSIGN
  | NOT
  | AND
  | OR
  | LT
  | GT
  | LE
  | GE
  | EQ
  | NE
  | EOF

open Parsing;;
let _ = parse_error;;
# 2 "src/parser.mly"
open Ast
# 40 "src/parser.ml"
let yytransl_const = [|
  259 (* INT *);
  260 (* VOID *);
  261 (* IF *);
  262 (* ELSE *);
  263 (* WHILE *);
  264 (* BREAK *);
  265 (* CONTINUE *);
  266 (* RETURN *);
  267 (* SEMICOLON *);
  268 (* COMMA *);
  269 (* LPAREN *);
  270 (* RPAREN *);
  271 (* LBRACE *);
  272 (* RBRACE *);
  273 (* ADD *);
  274 (* SUB *);
  275 (* MUL *);
  276 (* DIV *);
  277 (* MOD *);
  278 (* ASSIGN *);
  279 (* NOT *);
  280 (* AND *);
  281 (* OR *);
  282 (* LT *);
  283 (* GT *);
  284 (* LE *);
  285 (* GE *);
  286 (* EQ *);
  287 (* NE *);
    0 (* EOF *);
    0|]

let yytransl_block = [|
  257 (* NUM *);
  258 (* ID *);
    0|]

let yylhs = "\255\255\
\001\000\002\000\002\000\003\000\004\000\004\000\005\000\005\000\
\005\000\007\000\006\000\008\000\008\000\009\000\009\000\009\000\
\009\000\009\000\009\000\009\000\009\000\009\000\009\000\011\000\
\011\000\010\000\012\000\012\000\013\000\013\000\014\000\014\000\
\015\000\015\000\015\000\016\000\016\000\016\000\016\000\016\000\
\017\000\017\000\017\000\018\000\018\000\018\000\018\000\019\000\
\019\000\019\000\019\000\020\000\020\000\022\000\022\000\022\000\
\021\000\021\000\021\000\000\000"

let yylen = "\002\000\
\002\000\000\000\002\000\006\000\001\000\001\000\000\000\001\000\
\003\000\002\000\003\000\000\000\002\000\002\000\001\000\001\000\
\005\000\005\000\002\000\002\000\003\000\005\000\007\000\000\000\
\001\000\001\000\003\000\001\000\001\000\003\000\001\000\003\000\
\001\000\003\000\003\000\001\000\003\000\003\000\003\000\003\000\
\001\000\003\000\003\000\001\000\003\000\003\000\003\000\001\000\
\002\000\002\000\002\000\001\000\004\000\000\000\001\000\003\000\
\001\000\001\000\003\000\002\000"

let yydefred = "\000\000\
\000\000\000\000\005\000\006\000\060\000\000\000\000\000\000\000\
\001\000\003\000\000\000\000\000\000\000\000\000\000\000\010\000\
\000\000\000\000\000\000\004\000\009\000\058\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\
\000\000\000\000\015\000\000\000\000\000\000\000\026\000\000\000\
\000\000\000\000\000\000\000\000\000\000\044\000\048\000\052\000\
\000\000\000\000\000\000\000\000\000\000\019\000\020\000\025\000\
\000\000\000\000\000\000\049\000\050\000\051\000\011\000\013\000\
\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\027\000\000\000\000\000\000\000\021\000\059\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\045\000\046\000\047\000\000\000\053\000\000\000\000\000\000\000\
\056\000\017\000\000\000\018\000\000\000\023\000"

let yydgoto = "\002\000\
\005\000\006\000\007\000\008\000\014\000\035\000\015\000\036\000\
\037\000\038\000\057\000\039\000\040\000\041\000\042\000\043\000\
\044\000\045\000\046\000\047\000\048\000\080\000"

let yysindex = "\002\000\
\102\255\000\000\000\000\000\000\000\000\007\000\102\255\014\255\
\000\000\000\000\006\255\027\255\034\255\041\255\026\255\000\000\
\044\255\027\255\055\255\000\000\000\000\000\000\244\254\059\255\
\054\255\056\255\076\255\078\255\073\255\000\000\073\255\075\255\
\075\255\075\255\000\000\101\255\055\255\088\255\000\000\098\255\
\124\255\089\255\017\255\123\255\064\255\000\000\000\000\000\000\
\073\255\073\255\137\255\073\255\073\255\000\000\000\000\000\000\
\115\255\147\255\149\255\000\000\000\000\000\000\000\000\000\000\
\000\000\075\255\075\255\075\255\075\255\075\255\075\255\075\255\
\075\255\075\255\075\255\075\255\075\255\075\255\155\255\174\255\
\000\000\073\255\176\255\177\255\000\000\000\000\124\255\089\255\
\017\255\017\255\123\255\123\255\123\255\123\255\064\255\064\255\
\000\000\000\000\000\000\073\255\000\000\158\255\055\255\055\255\
\000\000\000\000\186\255\000\000\055\255\000\000"

let yyrindex = "\000\000\
\193\000\000\000\000\000\000\000\000\000\000\000\193\000\000\000\
\000\000\000\000\000\000\182\255\000\000\000\000\184\255\000\000\
\000\000\182\255\201\255\000\000\000\000\000\000\083\255\000\000\
\000\000\000\000\000\000\000\000\208\255\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\201\255\000\000\000\000\040\255\
\003\255\253\254\233\255\154\255\104\255\000\000\000\000\000\000\
\206\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\083\255\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\207\255\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\113\255\006\000\
\237\255\241\255\175\255\183\255\204\255\212\255\125\255\146\255\
\000\000\000\000\000\000\206\255\000\000\000\000\000\000\000\000\
\000\000\000\000\024\255\000\000\000\000\000\000"

let yygindex = "\000\000\
\000\000\215\000\000\000\000\000\207\000\210\000\000\000\209\000\
\165\255\227\255\000\000\200\000\000\000\188\000\189\000\076\000\
\009\000\072\000\228\255\000\000\000\000\159\000"

let yytablesize = 287
let yytable = "\056\000\
\049\000\058\000\001\000\060\000\061\000\062\000\009\000\031\000\
\031\000\050\000\031\000\107\000\108\000\029\000\029\000\011\000\
\029\000\110\000\012\000\079\000\031\000\031\000\083\000\084\000\
\022\000\022\000\022\000\029\000\022\000\013\000\022\000\022\000\
\022\000\022\000\022\000\016\000\022\000\018\000\022\000\022\000\
\022\000\022\000\070\000\071\000\072\000\073\000\022\000\097\000\
\098\000\099\000\028\000\028\000\102\000\028\000\017\000\022\000\
\023\000\024\000\019\000\025\000\051\000\026\000\027\000\028\000\
\029\000\030\000\052\000\031\000\053\000\019\000\079\000\032\000\
\033\000\022\000\023\000\022\000\059\000\034\000\091\000\092\000\
\093\000\094\000\076\000\077\000\078\000\031\000\054\000\031\000\
\055\000\032\000\033\000\032\000\033\000\057\000\057\000\034\000\
\057\000\034\000\065\000\057\000\057\000\057\000\057\000\057\000\
\003\000\004\000\057\000\057\000\057\000\057\000\057\000\057\000\
\057\000\057\000\041\000\041\000\063\000\041\000\068\000\069\000\
\041\000\041\000\066\000\030\000\030\000\085\000\030\000\041\000\
\041\000\041\000\041\000\041\000\041\000\041\000\041\000\042\000\
\042\000\030\000\042\000\074\000\075\000\042\000\042\000\089\000\
\090\000\095\000\096\000\067\000\042\000\042\000\042\000\042\000\
\042\000\042\000\042\000\042\000\043\000\043\000\082\000\043\000\
\086\000\049\000\043\000\043\000\036\000\036\000\100\000\036\000\
\106\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\
\043\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
\036\000\037\000\037\000\101\000\037\000\103\000\104\000\109\000\
\002\000\038\000\038\000\007\000\038\000\008\000\037\000\037\000\
\037\000\037\000\037\000\037\000\037\000\037\000\038\000\038\000\
\038\000\038\000\038\000\038\000\038\000\038\000\039\000\039\000\
\012\000\039\000\024\000\054\000\055\000\010\000\040\000\040\000\
\021\000\040\000\020\000\039\000\039\000\039\000\039\000\039\000\
\039\000\039\000\039\000\040\000\040\000\040\000\040\000\040\000\
\040\000\040\000\040\000\033\000\033\000\064\000\033\000\034\000\
\034\000\081\000\034\000\035\000\035\000\087\000\035\000\088\000\
\033\000\033\000\105\000\000\000\034\000\034\000\033\000\033\000\
\035\000\035\000\034\000\034\000\000\000\000\000\035\000\035\000\
\032\000\032\000\000\000\032\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\032\000\032\000"

let yycheck = "\029\000\
\013\001\031\000\001\000\032\000\033\000\034\000\000\000\011\001\
\012\001\022\001\014\001\103\000\104\000\011\001\012\001\002\001\
\014\001\109\000\013\001\049\000\024\001\025\001\052\000\053\000\
\001\001\002\001\003\001\025\001\005\001\003\001\007\001\008\001\
\009\001\010\001\011\001\002\001\013\001\012\001\015\001\016\001\
\017\001\018\001\026\001\027\001\028\001\029\001\023\001\076\000\
\077\000\078\000\011\001\012\001\082\000\014\001\014\001\001\001\
\002\001\003\001\015\001\005\001\002\001\007\001\008\001\009\001\
\010\001\011\001\013\001\013\001\013\001\015\001\100\000\017\001\
\018\001\001\001\002\001\001\001\002\001\023\001\070\000\071\000\
\072\000\073\000\019\001\020\001\021\001\013\001\011\001\013\001\
\011\001\017\001\018\001\017\001\018\001\011\001\012\001\023\001\
\014\001\023\001\011\001\017\001\018\001\019\001\020\001\021\001\
\003\001\004\001\024\001\025\001\026\001\027\001\028\001\029\001\
\030\001\031\001\011\001\012\001\016\001\014\001\030\001\031\001\
\017\001\018\001\025\001\011\001\012\001\011\001\014\001\024\001\
\025\001\026\001\027\001\028\001\029\001\030\001\031\001\011\001\
\012\001\025\001\014\001\017\001\018\001\017\001\018\001\068\000\
\069\000\074\000\075\000\024\001\024\001\025\001\026\001\027\001\
\028\001\029\001\030\001\031\001\011\001\012\001\022\001\014\001\
\014\001\013\001\017\001\018\001\011\001\012\001\012\001\014\001\
\011\001\024\001\025\001\026\001\027\001\028\001\029\001\030\001\
\031\001\024\001\025\001\026\001\027\001\028\001\029\001\030\001\
\031\001\011\001\012\001\014\001\014\001\014\001\014\001\006\001\
\000\000\011\001\012\001\014\001\014\001\014\001\024\001\025\001\
\026\001\027\001\028\001\029\001\030\001\031\001\024\001\025\001\
\026\001\027\001\028\001\029\001\030\001\031\001\011\001\012\001\
\016\001\014\001\011\001\014\001\014\001\007\000\011\001\012\001\
\018\000\014\001\017\000\024\001\025\001\026\001\027\001\028\001\
\029\001\030\001\031\001\024\001\025\001\026\001\027\001\028\001\
\029\001\030\001\031\001\011\001\012\001\037\000\014\001\011\001\
\012\001\050\000\014\001\011\001\012\001\066\000\014\001\067\000\
\024\001\025\001\100\000\255\255\024\001\025\001\030\001\031\001\
\024\001\025\001\030\001\031\001\255\255\255\255\030\001\031\001\
\011\001\012\001\255\255\014\001\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\024\001\025\001"

let yynames_const = "\
  INT\000\
  VOID\000\
  IF\000\
  ELSE\000\
  WHILE\000\
  BREAK\000\
  CONTINUE\000\
  RETURN\000\
  SEMICOLON\000\
  COMMA\000\
  LPAREN\000\
  RPAREN\000\
  LBRACE\000\
  RBRACE\000\
  ADD\000\
  SUB\000\
  MUL\000\
  DIV\000\
  MOD\000\
  ASSIGN\000\
  NOT\000\
  AND\000\
  OR\000\
  LT\000\
  GT\000\
  LE\000\
  GE\000\
  EQ\000\
  NE\000\
  EOF\000\
  "

let yynames_block = "\
  NUM\000\
  ID\000\
  "

let yyact = [|
  (fun _ -> failwith "parser")
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 1 : 'function_def_list) in
    Obj.repr(
# 31 "src/parser.mly"
                        ( _1 )
# 279 "src/parser.ml"
               : Ast.program))
; (fun __caml_parser_env ->
    Obj.repr(
# 34 "src/parser.mly"
  ( [] )
# 285 "src/parser.ml"
               : 'function_def_list))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 1 : 'function_def) in
    let _2 = (Parsing.peek_val __caml_parser_env 0 : 'function_def_list) in
    Obj.repr(
# 35 "src/parser.mly"
                                 ( _1 :: _2 )
# 293 "src/parser.ml"
               : 'function_def_list))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 5 : 'type_specifier) in
    let _2 = (Parsing.peek_val __caml_parser_env 4 : string) in
    let _4 = (Parsing.peek_val __caml_parser_env 2 : 'param_list) in
    let _6 = (Parsing.peek_val __caml_parser_env 0 : 'block) in
    Obj.repr(
# 39 "src/parser.mly"
   ( {
        return_type = _1;
        name = _2;
        params = _4;
        body = _6;
     } 
   )
# 309 "src/parser.ml"
               : 'function_def))
; (fun __caml_parser_env ->
    Obj.repr(
# 48 "src/parser.mly"
      ( Int )
# 315 "src/parser.ml"
               : 'type_specifier))
; (fun __caml_parser_env ->
    Obj.repr(
# 49 "src/parser.mly"
       ( Void )
# 321 "src/parser.ml"
               : 'type_specifier))
; (fun __caml_parser_env ->
    Obj.repr(
# 52 "src/parser.mly"
  ( [] )
# 327 "src/parser.ml"
               : 'param_list))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'param) in
    Obj.repr(
# 53 "src/parser.mly"
        ( [_1] )
# 334 "src/parser.ml"
               : 'param_list))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'param) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'param_list) in
    Obj.repr(
# 54 "src/parser.mly"
                         ( _1 :: _3 )
# 342 "src/parser.ml"
               : 'param_list))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 0 : string) in
    Obj.repr(
# 57 "src/parser.mly"
         ( (Int, _2) )
# 349 "src/parser.ml"
               : 'param))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 1 : 'stmt_list) in
    Obj.repr(
# 60 "src/parser.mly"
                          ( _2 )
# 356 "src/parser.ml"
               : 'block))
; (fun __caml_parser_env ->
    Obj.repr(
# 63 "src/parser.mly"
  ( [] )
# 362 "src/parser.ml"
               : 'stmt_list))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 1 : 'stmt) in
    let _2 = (Parsing.peek_val __caml_parser_env 0 : 'stmt_list) in
    Obj.repr(
# 64 "src/parser.mly"
                 ( _1 :: _2 )
# 370 "src/parser.ml"
               : 'stmt_list))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 1 : 'expr) in
    Obj.repr(
# 67 "src/parser.mly"
                 ( ExprStmt _1 )
# 377 "src/parser.ml"
               : 'stmt))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'block) in
    Obj.repr(
# 68 "src/parser.mly"
        ( Block _1 )
# 384 "src/parser.ml"
               : 'stmt))
; (fun __caml_parser_env ->
    Obj.repr(
# 69 "src/parser.mly"
            ( Empty )
# 390 "src/parser.ml"
               : 'stmt))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 3 : string) in
    let _4 = (Parsing.peek_val __caml_parser_env 1 : 'expr) in
    Obj.repr(
# 70 "src/parser.mly"
                               ( VarDecl (_2, _4) )
# 398 "src/parser.ml"
               : 'stmt))
; (fun __caml_parser_env ->
    let _3 = (Parsing.peek_val __caml_parser_env 2 : 'expr) in
    let _5 = (Parsing.peek_val __caml_parser_env 0 : 'stmt) in
    Obj.repr(
# 71 "src/parser.mly"
                                ( While (_3, _5) )
# 406 "src/parser.ml"
               : 'stmt))
; (fun __caml_parser_env ->
    Obj.repr(
# 72 "src/parser.mly"
                  ( Break )
# 412 "src/parser.ml"
               : 'stmt))
; (fun __caml_parser_env ->
    Obj.repr(
# 73 "src/parser.mly"
                     ( Continue )
# 418 "src/parser.ml"
               : 'stmt))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 1 : 'expr_opt) in
    Obj.repr(
# 74 "src/parser.mly"
                            ( Return _2 )
# 425 "src/parser.ml"
               : 'stmt))
; (fun __caml_parser_env ->
    let _3 = (Parsing.peek_val __caml_parser_env 2 : 'expr) in
    let _5 = (Parsing.peek_val __caml_parser_env 0 : 'stmt) in
    Obj.repr(
# 75 "src/parser.mly"
                                        ( If (_3, _5, None) )
# 433 "src/parser.ml"
               : 'stmt))
; (fun __caml_parser_env ->
    let _3 = (Parsing.peek_val __caml_parser_env 4 : 'expr) in
    let _5 = (Parsing.peek_val __caml_parser_env 2 : 'stmt) in
    let _7 = (Parsing.peek_val __caml_parser_env 0 : 'stmt) in
    Obj.repr(
# 76 "src/parser.mly"
                                       ( If (_3, _5, Some _7) )
# 442 "src/parser.ml"
               : 'stmt))
; (fun __caml_parser_env ->
    Obj.repr(
# 79 "src/parser.mly"
  ( None )
# 448 "src/parser.ml"
               : 'expr_opt))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'expr) in
    Obj.repr(
# 80 "src/parser.mly"
       ( Some _1 )
# 455 "src/parser.ml"
               : 'expr_opt))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'assign_expr) in
    Obj.repr(
# 83 "src/parser.mly"
              ( _1 )
# 462 "src/parser.ml"
               : 'expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : string) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'assign_expr) in
    Obj.repr(
# 86 "src/parser.mly"
                        ( BinaryOp (Assign, Identifier _1, _3) )
# 470 "src/parser.ml"
               : 'assign_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'lor_expr) in
    Obj.repr(
# 87 "src/parser.mly"
           ( _1 )
# 477 "src/parser.ml"
               : 'assign_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'land_expr) in
    Obj.repr(
# 90 "src/parser.mly"
            ( _1 )
# 484 "src/parser.ml"
               : 'lor_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'lor_expr) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'land_expr) in
    Obj.repr(
# 91 "src/parser.mly"
                        ( BinaryOp (Or, _1, _3) )
# 492 "src/parser.ml"
               : 'lor_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'eq_expr) in
    Obj.repr(
# 94 "src/parser.mly"
          ( _1 )
# 499 "src/parser.ml"
               : 'land_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'land_expr) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'eq_expr) in
    Obj.repr(
# 95 "src/parser.mly"
                        ( BinaryOp (And, _1, _3) )
# 507 "src/parser.ml"
               : 'land_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'rel_expr) in
    Obj.repr(
# 98 "src/parser.mly"
           ( _1 )
# 514 "src/parser.ml"
               : 'eq_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'eq_expr) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'rel_expr) in
    Obj.repr(
# 99 "src/parser.mly"
                      ( BinaryOp (Eq, _1, _3) )
# 522 "src/parser.ml"
               : 'eq_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'eq_expr) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'rel_expr) in
    Obj.repr(
# 100 "src/parser.mly"
                      ( BinaryOp (Ne, _1, _3) )
# 530 "src/parser.ml"
               : 'eq_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'add_expr) in
    Obj.repr(
# 103 "src/parser.mly"
           ( _1 )
# 537 "src/parser.ml"
               : 'rel_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'rel_expr) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'add_expr) in
    Obj.repr(
# 104 "src/parser.mly"
                       ( BinaryOp (Lt, _1, _3) )
# 545 "src/parser.ml"
               : 'rel_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'rel_expr) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'add_expr) in
    Obj.repr(
# 105 "src/parser.mly"
                       ( BinaryOp (Gt, _1, _3) )
# 553 "src/parser.ml"
               : 'rel_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'rel_expr) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'add_expr) in
    Obj.repr(
# 106 "src/parser.mly"
                       ( BinaryOp (Le, _1, _3) )
# 561 "src/parser.ml"
               : 'rel_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'rel_expr) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'add_expr) in
    Obj.repr(
# 107 "src/parser.mly"
                       ( BinaryOp (Ge, _1, _3) )
# 569 "src/parser.ml"
               : 'rel_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'mul_expr) in
    Obj.repr(
# 110 "src/parser.mly"
           ( _1 )
# 576 "src/parser.ml"
               : 'add_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'add_expr) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'mul_expr) in
    Obj.repr(
# 111 "src/parser.mly"
                        ( BinaryOp (Add, _1, _3) )
# 584 "src/parser.ml"
               : 'add_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'add_expr) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'mul_expr) in
    Obj.repr(
# 112 "src/parser.mly"
                        ( BinaryOp (Sub, _1, _3) )
# 592 "src/parser.ml"
               : 'add_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'unary_expr) in
    Obj.repr(
# 115 "src/parser.mly"
             ( _1 )
# 599 "src/parser.ml"
               : 'mul_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'mul_expr) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'unary_expr) in
    Obj.repr(
# 116 "src/parser.mly"
                          ( BinaryOp (Mul, _1, _3) )
# 607 "src/parser.ml"
               : 'mul_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'mul_expr) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'unary_expr) in
    Obj.repr(
# 117 "src/parser.mly"
                          ( BinaryOp (Div, _1, _3) )
# 615 "src/parser.ml"
               : 'mul_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'mul_expr) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'unary_expr) in
    Obj.repr(
# 118 "src/parser.mly"
                          ( BinaryOp (Mod, _1, _3) )
# 623 "src/parser.ml"
               : 'mul_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'postfix_expr) in
    Obj.repr(
# 121 "src/parser.mly"
               ( _1 )
# 630 "src/parser.ml"
               : 'unary_expr))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 0 : 'unary_expr) in
    Obj.repr(
# 122 "src/parser.mly"
                 ( UnaryOp (Plus, _2) )
# 637 "src/parser.ml"
               : 'unary_expr))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 0 : 'unary_expr) in
    Obj.repr(
# 123 "src/parser.mly"
                 ( UnaryOp (Minus, _2) )
# 644 "src/parser.ml"
               : 'unary_expr))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 0 : 'unary_expr) in
    Obj.repr(
# 124 "src/parser.mly"
                 ( UnaryOp (Not, _2) )
# 651 "src/parser.ml"
               : 'unary_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'primary_expr) in
    Obj.repr(
# 127 "src/parser.mly"
               ( _1 )
# 658 "src/parser.ml"
               : 'postfix_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 3 : string) in
    let _3 = (Parsing.peek_val __caml_parser_env 1 : 'expr_list) in
    Obj.repr(
# 128 "src/parser.mly"
                             ( Call (_1, _3) )
# 666 "src/parser.ml"
               : 'postfix_expr))
; (fun __caml_parser_env ->
    Obj.repr(
# 131 "src/parser.mly"
  ( [] )
# 672 "src/parser.ml"
               : 'expr_list))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'expr) in
    Obj.repr(
# 132 "src/parser.mly"
       ( [_1] )
# 679 "src/parser.ml"
               : 'expr_list))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'expr) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'expr_list) in
    Obj.repr(
# 133 "src/parser.mly"
                       ( _1 :: _3 )
# 687 "src/parser.ml"
               : 'expr_list))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in
    Obj.repr(
# 136 "src/parser.mly"
     ( Identifier _1 )
# 694 "src/parser.ml"
               : 'primary_expr))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : int) in
    Obj.repr(
# 137 "src/parser.mly"
      ( Number _1 )
# 701 "src/parser.ml"
               : 'primary_expr))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 1 : 'expr) in
    Obj.repr(
# 138 "src/parser.mly"
                     ( Paren _2 )
# 708 "src/parser.ml"
               : 'primary_expr))
(* Entry program *)
; (fun __caml_parser_env -> raise (Parsing.YYexit (Parsing.peek_val __caml_parser_env 0)))
|]
let yytables =
  { Parsing.actions=yyact;
    Parsing.transl_const=yytransl_const;
    Parsing.transl_block=yytransl_block;
    Parsing.lhs=yylhs;
    Parsing.len=yylen;
    Parsing.defred=yydefred;
    Parsing.dgoto=yydgoto;
    Parsing.sindex=yysindex;
    Parsing.rindex=yyrindex;
    Parsing.gindex=yygindex;
    Parsing.tablesize=yytablesize;
    Parsing.table=yytable;
    Parsing.check=yycheck;
    Parsing.error_function=parse_error;
    Parsing.names_const=yynames_const;
    Parsing.names_block=yynames_block }
let program (lexfun : Lexing.lexbuf -> token) (lexbuf : Lexing.lexbuf) =
   (Parsing.yyparse yytables 1 lexfun lexbuf : Ast.program)
;;
